home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / asm / Tandem2.68.lha / Tandem / Includes / Front.i next >
Text File  |  2000-04-02  |  7KB  |  241 lines

  1. * Front.i             revision 2.62 3.24.00    *  (extract from Tandem.i)
  2.  
  3.  include 'IncAll.i'        ;get AmigaOS includes & FDs
  4.  
  5. ************************* set what assembled ***************************
  6.  
  7. xxp_what: EQU  1  ;set:  0=tandem.library  1=front.i  2=tandem.i
  8.  
  9. * If xxp_what=1, remove all lines from line starting with *####....
  10.  
  11. ************************* data & structures ****************************
  12.  
  13.  IFNE xxp_what             ;#^1 only assemble this if not in tandem.library
  14.  
  15. * begin warmup ready to call Program
  16. TLColdstart:
  17.  tst.l (a7)                ;always NE (but tandem sets EQ if debugging)
  18.  sub.l #1024,a7            ;create instance of xxp_tndm
  19.  move.l a7,a4              ;a4 points to xxp_tndm
  20.  seq d7                    ;D7=-1 if debugging, else 0
  21.  ext.w d7
  22.  
  23.  move.l a7,a6              ;clear the xxp_tndm structure
  24.  add.w #1024,a6
  25. .clrr:
  26.  clr.l -(a6)
  27.  cmp.l a4,a6
  28.  bne .clrr
  29.  
  30.  move.w d7,xxp_tand(a4)    ;xxp_tand=-1 if debugging, else 0
  31.  move.l a0,xxp_A0D0+0(a4)  ;save CLI parameters addr & len
  32.  move.l d0,xxp_A0D0+4(a4)
  33.  
  34.  move.l _AbsExecBase,a6
  35.  move.l a6,xxp_sysb(a4)    ;set xxp_sysb
  36.  sub.l a1,a1               ;for current task..
  37.  jsr _LVOFindTask(a6)      ;.. find own Process structure
  38.  move.l d0,a2              ;(A2) = our own Process structure
  39.  tst.l pr_CLI(a2)          ;pr_CLI<>0 if from CLI
  40.  bne.s .cli                ;go if from CLI
  41.  
  42.  lea pr_MsgPort(a2),a0     ;wait for workbench startup message to arrive
  43.  jsr _LVOWaitPort(a6)
  44.  lea pr_MsgPort(a2),a0     ;get workbench startup message now it's here
  45.  jsr _LVOGetMsg(a6)
  46.  move.l d0,xxp_bnch(a4)    ;remember the message, for replying &c
  47.  
  48. .cli:
  49.  move.l #strings,xxp_strg(a4)    ;Program must contain 'strings: DC.B 0'
  50.  
  51.  moveq #-1,d7              ;will be 0 if dos.library < xxp_lver
  52.  lea .dosn,a1              ;open dos.library
  53.  moveq #xxp_lver,d0        ;at least version xxp_lver
  54.  jsr _LVOOpenLibrary(a6)
  55.  move.l d0,xxp_dosb(a4)    ;set dosbase
  56.  bne.s .doso               ;go if dos.library open
  57.  
  58.  moveq #0,d7               ;signal libraries < version xxp_lver
  59.  moveq #0,d0               ;open earlier dos.library so can report error
  60.  lea .dosn,a1
  61.  jsr _LVOOpenLibrary(a6)
  62.  move.l d0,xxp_dosb(a4)
  63.  beq .kill                 ;go if can't open earlier dos.library (unlikely)
  64.  
  65. .doso:
  66.  move.l d0,a6              ;ready A6 for dos.library calls
  67.  tst.l xxp_bnch(a4)        ;go if workbench
  68.  bne.s .bench
  69.  
  70.  jsr _LVOInput(a6)         ;if CLI, xxp_iput = CLI input stream
  71.  move.l d0,xxp_iput(a4)
  72.  jsr _LVOOutput(a6)        ;if CLI, xxp_oput = CLI output stream
  73.  move.l d0,xxp_oput(a4)
  74.  bra.s .both               ;& continue
  75.  
  76. .bench:
  77.  move.l #.conn,d1          ;if workbench, open a console
  78.  move.l #MODE_NEWFILE,d2
  79.  jsr _LVOOpen(a6)
  80.  move.l d0,xxp_iput(a4)    ;if workbench, xxp_iput = console
  81.  move.l d0,xxp_oput(a4)    ;if workbench, xxp_oput = console
  82.  beq .kill                 ;abort if can't open console (unlikely)
  83.  
  84. .both:
  85.  tst.w d7                  ;report & quit if dos.library < xxp_lver
  86.  beq .badv
  87.  
  88.  move.l xxp_sysb(a4),a6    ;open other libraries
  89.  lea .intn,a1
  90.  moveq #xxp_lver,d0
  91.  jsr _LVOOpenLibrary(a6)   ;intuition.library
  92.  move.l d0,xxp_intb(a4)
  93.  beq .badv
  94.  lea .gfxn,a1              ;graphics.library
  95.  moveq #xxp_lver,d0
  96.  jsr _LVOOpenLibrary(a6)
  97.  move.l d0,xxp_gfxb(a4)
  98.  beq .badv
  99.  lea .asln,a1              ;asl.library
  100.  moveq #xxp_lver,d0
  101.  jsr _LVOOpenLibrary(a6)
  102.  move.l d0,xxp_aslb(a4)
  103.  beq .badv
  104.  lea .gadn,a1              ;gadtools.library
  105.  moveq #xxp_lver,d0
  106.  jsr _LVOOpenLibrary(a6)
  107.  move.l d0,xxp_gadb(a4)
  108.  beq .badv
  109.  
  110.  move.l xxp_dosb(a4),a6    ;CD to progdir, set xxp_cdir
  111.  jsr _LVOGetProgramDir(a6)
  112.  move.l d0,d1
  113.  jsr _LVOCurrentDir(a6)
  114.  move.l d0,xxp_cdir(a4)    ;save aboriginal CD
  115.  move.l xxp_sysb(a4),a6
  116.  
  117.  IFEQ xxp_what-1           ;#^2  Only open tandem.library if in Front.i
  118.  lea .tann,a1
  119.  moveq #xxp_tver,d0
  120.  jsr _LVOOpenLibrary(a6)
  121.  bsr .abdir
  122.  move.l d0,xxp_tanb(a4)
  123.  beq.s .badt               ;quit if can't
  124.  ENDC                      ;^2
  125.  
  126.  IFEQ xxp_what-2           ;#^3    ;} (dummy xxp_tanb if in tandem.i)
  127.  move.l #TLEndcode+24,xxp_tanb(a4) ;} (as if in tandem.library)
  128.  bsr .abdir
  129.  ENDC                      ;#^3
  130.  
  131.  move.l 1028(a4),d0        ;get val above root of stack (=size if CLI)
  132.  sub.l #1036,d0            ;adjust for Front.i usage
  133.  move.l d0,-(a7)           ;put CLI stack size above return addr of Program
  134.  move.l xxp_A0D0+0(a4),a0  ;restore A0,D0 as called (meaningful if CLI)
  135.  move.l xxp_A0D0+4(a4),d0
  136.  jsr Program               ;* do user program (A4=xxp_tndm, A6=xxp_sysb)
  137.  addq.l #4,a7              ;slough stack size
  138.  
  139.  move.l a7,a4              ;reload A4 with xxp_tndm
  140.  bsr .abdir                ;back to aboriginal CD (if changed by Program)
  141.  move.l xxp_tanb(a4),a6
  142.  jsr _LVOTLWclose(a6)      ;call TLWclose (closes everything in xxp_tndm)
  143.  moveq #0,d0               ;signal ok
  144.  tst.w xxp_ackn(a4)
  145.  beq .wrap                 ;ok if ack=0
  146.  
  147.  move.l #.brep,d2          ;else, wait for acknowledge, return bad
  148.  move.l #.dosn-.brep,d3
  149.  bra.s .bad
  150.  
  151. .badt:                     ;branch here if can't open tandem.library
  152.  move.l #.trep,d2
  153.  move.l #.lrep-.trep,d3
  154.  bra.s .bad
  155.  
  156. .badv:                     ;branch here if library version < xxp_lver
  157.  move.l #.lrep,d2
  158.  move.l #.dosn-.lrep,d3
  159.  
  160. .bad:
  161.  move.l xxp_oput(a4),d1    ;send error message
  162.  move.l xxp_dosb(a4),a6
  163.  jsr _LVOWrite(a6)
  164.  move.l a4,d2              ;wait for acknowledge
  165.  moveq #10,d3
  166.  move.l xxp_iput(a4),d1
  167.  jsr _LVORead(a6)
  168.  
  169. .kill:
  170.  moveq #-1,d0              ;signal bad (can't open console/libraries)
  171.  
  172. .wrap:
  173.  move.l d0,-(a7)           ;remember error code
  174.  move.l xxp_sysb(a4),a6
  175.  
  176.  IFEQ xxp_what-1           ;#^4
  177.  move.l xxp_tanb(a4),d0    ;(only close tandem.library if xxp_what=1)
  178.  bsr .clib                 ;(uses dummy tanbase if xxp_what=2)
  179.  ENDC                      ;#^4
  180.  
  181.  move.l xxp_gadb(a4),d0    ;close libraries (exc dos.library)
  182.  bsr .clib
  183.  move.l xxp_intb(a4),d0
  184.  bsr .clib
  185.  move.l xxp_aslb(a4),d0
  186.  bsr .clib
  187.  move.l xxp_gfxb(a4),d0
  188.  bsr .clib
  189.  
  190.  tst.l xxp_bnch(a4)        ;go if CLI
  191.  beq.s .ccli
  192.  
  193.  move.l xxp_oput(a4),d1    ;close console if open
  194.  beq.s .ccon
  195.  move.l xxp_dosb(a4),a6
  196.  jsr _LVOClose(a6)
  197. .ccon:
  198.  move.l xxp_sysb(a4),a6    ;reply to workbench startup message
  199.  jsr _LVOForbid(a6)
  200.  move.l xxp_bnch(a4),a1
  201.  jsr _LVOReplyMsg(a6)
  202.  
  203. .ccli:
  204.  move.l xxp_dosb(a4),d0    ;close dos.library
  205.  bsr .clib
  206.  move.l (a7)+,d0           ;error code (0 if ok, -1 if bad) in D0
  207.  add.l #1024,a7            ;restore stack
  208.  rts                       ;exit back to workbench/CLI
  209.  
  210. .clib:                     ;** close a library - base at d0 (EQ if unopened)
  211.  beq.s .clibq
  212.  move.l d0,a1
  213.  jsr _LVOCloseLibrary(a6)
  214. .clibq:
  215.  rts
  216.  
  217. .abdir:                    ;** CD back to aboriginal CD
  218.  movem.l d0-d1/a0-a1/a6,-(a7)
  219.  move.l xxp_dosb(a4),a6
  220.  move.l xxp_cdir(a4),d1
  221.  jsr _LVOCurrentDir(a6)
  222.  movem.l (a7)+,d0-d1/a0-a1/a6
  223.  rts
  224.  
  225. .trep: dc.b 'Error: can''t open tandem.library',$0A                ;}
  226.  dc.b '(Press <return> to acknowledge)',$0A,0                      ;} do
  227. .lrep: dc.b 'Error: must be release 2.04+ of operating system',$0A ;} not
  228. .brep: dc.b '(Press <return> to acknowledge)',$0A,0                ;} inter-
  229. .dosn: dc.b 'dos.library',0                                        ;} pose
  230. .intn: dc.b 'intuition.library',0
  231. .gfxn: dc.b 'graphics.library',0
  232. .asln: dc.b 'asl.library',0
  233. .gadn: dc.b 'gadtools.library',0
  234. .conn: dc.b 'CON:20/10/320/50/Console',0
  235. .tann: dc.b 'tandem.library',0
  236.  ds.w 0
  237.  
  238.  ENDC                      ;#^1
  239.  
  240.                            ;** This is the end of Front.i **
  241.